from requests.exceptions import RequestException
from lxml import etree
from bs4 import BeautifulSoup
from pyquery import PyQuery
import requests
import time,json,os

def getPage(url):
    '''爬取指定url页面信息'''
    try:
        # 定义请求头信息
        headers = {
            'User-Agent': 'User-Agent:Mozilla/5.0(WindowsNT6.1;rv:2.0.1)Gecko/20100101Firefox/4.0.1'
        }
        # 执行爬取
        res = requests.get(url, headers=headers)
        # 判断响应状态,并响应爬取内容
        if res.status_code == 200:
            return res.text
        else:
            return None
    except RequestException:
        return None

def parsePage(content):
    '''解析爬取网页中的内容，并返回字段结果'''

    # =======使用Beautiful Soup解析====================
    # 解析HTML文档
    soup = BeautifulSoup(content,"lxml")
    #获取网页中所有标签并遍历输出标签名
    items = soup.find_all(name="tr",attrs={"class":"item"})
    #遍历封装数据并返回
    for item in items:
        yield {
            'image':item.find(name="img",attrs={'width':'90'}).attrs['src'],
            'title':item.find(name="div",attrs={'class':'pl2'}).find(name="a").string,
            'author':item.find(name="p",attrs={'class':'pl'}).string,
            'score':item.find(name="span",attrs={'class':'rating_nums'}).string,
            'words': item.find(name="span", attrs={'class': 'inq'}).string,
        }



def writeFile(content):
    '''执行文件追加写操作'''
    with open("./result.txt", 'a', encoding='utf-8') as f:
        f.write(json.dumps(content, ensure_ascii=False) + "\n")
        # json.dumps 序列化时对中文默认使用的ascii编码.想输出真正的中文需要指定ensure_ascii=False


def main(offset):
    ''' 主程序函数，负责调度执行爬虫处理 '''
    url = 'https://book.douban.com/top250?start=' + str(offset)

    html = getPage(url)
    # 判断是否爬取到数据，并调用解析函数
    if html:
        for item in parsePage(html):
            #print(item)
            writeFile(item)

# 判断当前执行是否为主程序运行，并遍历调用主函数爬取数据
if __name__ == '__main__':
    if os.path.isfile('./result.txt'):
        os.remove('./result.txt')

    for i in range(10):
        main(offset=i*10)
        time.sleep(1)

    print("豆瓣图书数据，已写入result.txt文件！")
